#include "hilodeconexion.h"
#include "socketservidor.h"
#include <sstream>

#define PUERTO 15553
#define MAX_CANT_CONEXIONES 6

namespace red {
namespace hilos {

HiloDeConexion::HiloDeConexion(int p_iCantJugadores, Conexiones &p_Conexiones, JuegoServerImp* juego) :
	m_Conexiones(p_Conexiones),
	m_iCantJugadores(p_iCantJugadores)
{
		this->juego = juego;
}

HiloDeConexion::~HiloDeConexion() {
	this->join();
}

void HiloDeConexion::run() {

	SocketServidor t_SocketPrincipal(PUERTO, MAX_CANT_CONEXIONES);
	SocketServidor *t_pSocket = NULL;
	HiloDeEntrada *t_pHiloDeEntrada = NULL;
	conexion_t t_Conexion;

	while (this->m_Conexiones.bTodasCorrectas() &&
		this->m_Conexiones.size() < this->m_iCantJugadores) {

		t_pSocket = NULL;
		t_pSocket = t_SocketPrincipal.accept();

		if (!t_pSocket) {
		} else if (!t_pSocket->getUtilizable()) {
			delete t_pSocket;
		} else {

			t_pHiloDeEntrada = NULL;
			t_pHiloDeEntrada = new HiloDeEntrada(t_pSocket, this->juego, &mutex_juego);

			if (t_pHiloDeEntrada) {

				t_Conexion.pSocket = t_pSocket;
				t_Conexion.pHiloDeEntrada = t_pHiloDeEntrada;

				this->m_Conexiones.agregar(t_Conexion);
				t_pHiloDeEntrada->start();
				Protocolo protocolo(t_pSocket);
				//TODO::ESTO NO TIENE QUE IR ACA.
				std::stringstream jugadores;
				mutex_juego.lock();
				jugadores<<this->juego->getCantidadDeJugadores();
				mutex_juego.unlock();
				string configuraciones = "<configuraciones jugadores=\""+jugadores.str()+"\" mundo=\"Tierra\"/>\n";
				protocolo.bEnviarPaquete(configuraciones);
			}
		}
	}
}

}
}
